package model;

import java.io.File;
import java.io.IOException;
import java.util.Hashtable;

public interface PresentDistributor {
	/**
	 * Fuegt ein Geschenk hinzu
	 * 
	 * @param presentNumber
	 *            die Geschenknummer
	 * @param names
	 *            die Namen der Leute, fuer die dieses Geschenk passend ist
	 */
	void addPresent(Integer presentNumber, String[] names);

	/**
	 * loescht ein Geschenk
	 * 
	 * @param presentNumber
	 *            die Geschenkenummer
	 * @return true gdw. das Loeschen erfolgreich war
	 */
	boolean removePresent(Integer presentNumber);

	/**
	 * Berechnet alle moeglichen Geschenkverteilungen. Ein Eintrag im Array
	 * entspricht einer moeglichen Verteilung.
	 * 
	 * @return die moeglichen Verteilungen
	 */
	Hashtable<String, Present> getPresentDistribution();

	/**
	 * Gibt zu einem Personennamen alle Geschenke zur�ck, auf denen der
	 * �bergebene Name steht
	 * 
	 * @param name
	 *            der Name der Person
	 * @return die Geschenke
	 */
	Present[] getPresents(String name);

	/**
	 * Gibt zu einer Geschenknummer das zugeh�rige Geschenk zur�ck
	 * 
	 * @param presentNumber
	 *            die Geschenknummer
	 * @return das Geschenk
	 */
	Present getPresent(Integer presentNumber);

	/**
	 * Speichert die eingegebenen Geschenke in der angegebenen Datei
	 * 
	 * @param file
	 *            die Datei
	 * @throws IOException 
	 */
	void savePresents(File file) throws IOException;

	/**
	 * Laedt die zuvor gespeicherten Geschenke aus der angegebenen Datei
	 * 
	 * @param file
	 *            die zu ladende Datei
	 * @throws IOException 
	 * @throws ClassNotFoundException 
	 */
	void loadPresents(File file) throws IOException, ClassNotFoundException;

	/**
	 * Ueberprueft, ob eine Verteilung gueltig ist, d.h. ob jeder Person
	 * mindestens ein Geschenk zugeordnet wurde
	 * 
	 * @return true gdw. die Verteilung gueltig ist
	 */
	boolean isValidDistribution();

	/**
	 * Gibt alle Personennamen zurueck, die kein Geschenk erhalten haben
	 * 
	 * @return die Personennamen ohne Geschenk
	 */
	String[] getParticipantsWithoutPresents();

	/**
	 * Gibt die naechste freie Geschenknummer zurueck
	 * 
	 * @return die naechste freie Geschenknummer
	 */
	Integer getFreePresentNumber();

	/**
	 * Gibt die Nummern aller Geschenke zurueck
	 * 
	 * @return die Nummern aller Geschenke
	 */
	Integer[] getAllPresentNumbers();

	/**
	 * Gibt alle Geschenke zurueck
	 * 
	 * @return alle Geschenke
	 */
	Present[] getAllPresents();

	/**
	 * Fuegt einen Teilnehmer hinzu
	 * 
	 * @param name
	 *            der Name des Teilnehmers
	 *            @param gender das Geschlecht des Teilnehmers
	 */
	void addParticipant(String name, Category gender);

	/**
	 * Loescht einen Teilnehmer
	 * 
	 * @param name
	 *            der Name des Teilnehmers
	 * @return true gdw Teilnehmer geloescht wurde
	 */
	boolean deleteParticipant(String name);

	/**
	 * Gibt die Namen aller Teilnehmer zurueck
	 * 
	 * @return die Namen aller Teilnehmer
	 */
	String[] getAllParticipants();
}
